﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Data;
using produccion.reportes;
using produccion.vistamodelo;
using System.Threading;
using System.Globalization;

namespace produccion.forms
{
    /// <summary>
    /// Lógica de interacción para FRMinfOrdSec.xaml
    /// </summary>
    public partial class FRMinfOrdSec : Window
    {
        #region FJRF - VARIABLES GENERICAS DE TODO EL FORMULARIO
        MDOgeneral MdoGeneral = new MDOgeneral();//FJRF - Traemos toda la informacion y funciones de MdoGeneral

        DataTable DtEncabezadoYParametros;//FJRF - Usamos este DataTable para hacer consultas generales del os encabezados mas los parametros
        DataTable DtImprimir;//FJRF - Usamos este DataTable para imprimir
        DataTable DtConsulta;//FJRF - Usamos este DataTable para consultas temporales
        DataSet DsImprimir;//FJRF - Usamos este dataset para la impresion de consultas

        String StrConsulta;//FJRF - Para hacer consultas temporales
        //String StrRutaReporteCrystalReport = @"C:\produccion\produccion\reportes\";//FJRF - Esta es la ruta de los reportes de crystal reports
        String StrRutaReporteCrystalReport = @"reportes\";//FJRF - Esta es la ruta de los reportes de crystal reports
        #endregion

        public FRMinfOrdSec()
        {
            InitializeComponent();
        }

        private void butPro_Click(object sender, RoutedEventArgs e)
        {
            String StrProcesosIncluidosParaSp = "";//FJRF - Aqui almacenamos todos los procesos que tienen que enviarce en el sp

            if (ChkIncluirGarantias.IsChecked == true) { StrProcesosIncluidosParaSp = StrProcesosIncluidosParaSp + "G-"; }
            if (ChkIncluirProduccion.IsChecked == true) { StrProcesosIncluidosParaSp = StrProcesosIncluidosParaSp + "P-"; }
            if (ChkIncluirDevolucion.IsChecked == true) { StrProcesosIncluidosParaSp = StrProcesosIncluidosParaSp + "D-"; }
            if (ChkIncluirReparacion.IsChecked == true) { StrProcesosIncluidosParaSp = StrProcesosIncluidosParaSp + "R-"; }
            if (ChkIncluirReconocidos.IsChecked == true) { StrProcesosIncluidosParaSp = StrProcesosIncluidosParaSp + "C-"; }
            if (ChkIncluirServicios.IsChecked == true) { StrProcesosIncluidosParaSp = StrProcesosIncluidosParaSp + "S-"; }

            infOrdSec.Instance.strTipo = StrProcesosIncluidosParaSp;
            infOrdSec.Instance.consInfOrdSec(StrProcesosIncluidosParaSp);

            DtgOrdenesProcesadas.ItemsSource = infOrdSec.Instance.DtOrdenesProcesadas.DefaultView;
        }
        private void butImp_Click(object sender, RoutedEventArgs e)
        {
            infOrdSec.Instance.Imprimir();
        }

        private void butSal_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

        private void Window_Closed(object sender, EventArgs e)
        {
            infOrdSec.Instance = null;
        }

        private void dataGrid1_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.Enter && elemento != null)
            {
                e.Handled = true;
                elemento.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            }
        }

        private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.F3 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta == true) { MDOgeneral.logBusquedadAbierta = false; }
            }

            if (e.Key == Key.F4 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta1 == true) { MDOgeneral.logBusquedadAbierta1 = false; }
            }

            if (e.Key == Key.F5 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta2 == true) { MDOgeneral.logBusquedadAbierta2 = false; }
            }
        }

        private void dataGrid1_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            if (dataGrid1.SelectedItem == null)//FJRF - Si no hay algun pedido seleccionado hacemos lo siguiente
            {
                return;//FJRF - Nos salimos
            }
            else //FJRF - Si tiene datos hacemos lo siguiente
            {
                DataRowView dr = dataGrid1.SelectedItem as DataRowView;//FJRF - Cargamos un DataRowView con el dato seleccionado
                DataRow dr1 = dr.Row;//FJRF - Asignamos las finas
                String StrOrden = Convert.ToString(dr1.ItemArray[3]);//FJRF - Decimos que en la columna 0 nos traiga el dato de la fila seleccionada

                FRMconsordens _co = new FRMconsordens();
                _co.texOrd.Text = StrOrden;
                _co.texPed.Text = "0";
                _co.texRef.Text = "";
                _co.comCli.SelectedIndex = -1;
                _co.comCol.SelectedIndex = -1;
                _co.comSub.SelectedItem = -1;
                _co.datePicker1.SelectedDate = Convert.ToDateTime("01/01/" + DateTime.Now.Year.ToString());
                _co.filtraOrd();
                _co.ShowDialog();
            }
        }

        private void DtgOrdenesProcesadas_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            string strNombreColumna = "";//FJRF - Variable para saber el nombre de la columna
            strNombreColumna = e.Column.Header.ToString();//FJRF - Extraemos el nombre de la columna

            e.Column.IsReadOnly = true;//FJRF - Inavilita las columnas para que no se pueda escribir sobre ella
            if (strNombreColumna == "ORDENES" || strNombreColumna == "PARES")//FJRF - Si alguna de las columnas tiene este nombre hacemos lo siguiente
            {
                Style MyStyleTextAlignmentProperty = new Style(typeof(DataGridCell));//FJRF - Creamos un nuevo estilo para la celda
                MyStyleTextAlignmentProperty.Setters.Add(new Setter(TextBlock.TextAlignmentProperty, TextAlignment.Right));//FJRF - Alineamos los datos de la celda a la derecha

                (e.Column as DataGridTextColumn).Binding.StringFormat = "{0:##,#0.##}";//FJRF - Enviamos el formato a la celda
                (e.Column as DataGridTextColumn).CellStyle = MyStyleTextAlignmentProperty;//FJRF - Asignamos el estilo creado

            }
            if (e.PropertyType == typeof(System.DateTime))//FJRF - Estas son las columnas que tendran el formato de fecha
            {
                (e.Column as DataGridTextColumn).Binding.StringFormat = "dd/MM/yyyy";//FJRF - Asignamos el formato a la fecha
            }
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            //FJRF - CON ESTO GARANTIZAMOS QUE LAS FECHAS SIEMPRE VENDRAN EN ESTE FORMATO DE DIA/MES/AÑO
            System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");//FJRF - Con esto aseguramos que la base de datos reciba los numeros como se deben recibir
            Thread.CurrentThread.CurrentCulture = (CultureInfo)Thread.CurrentThread.CurrentCulture.Clone();
            Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern = "dd/MM/yyyy";
        }

        private void BtnImprimirOrdenesProcesadas_Click(object sender, RoutedEventArgs e)
        {
            try//FJRF - Validamos el proceso de impresion 
            {
                String StrRutaReporteAImprimir = StrRutaReporteCrystalReport + "rptOrdenesProcesadas.rpt";//FJRF - Armamos la ruta completa donde estara el reporte
                if (System.IO.File.Exists(StrRutaReporteAImprimir) == true)//FJRf - Si el reporte existe hacemos lo siguiente
                {
                    #region FJRF - CargamosLosDatosQueSeVanAImprimir
                    if (infOrdSec.Instance.DtOrdenesProcesadas == null)//FJRF - Verificamos si existen datos de la consulta que se va a imprimir y si no hay datos hacemos lo siguiente
                    {
                        Msgbox("PROCESO CANCELADO", "No existen datos para imprimir el reporte", MessageBoxButton.OK, MessageBoxImage.Error); //FJRF - Informamos al usuario
                        return;//FJRF - Nos salimos
                    }
                    else//FJRF - Si hay datos hacemos lo siguiente
                    {
                        DtImprimir = new DataTable("DtDatosReporte");
                        DtImprimir = infOrdSec.Instance.DtOrdenesProcesadas.Copy();//FJRF - Hacemos una copia de los datos
                        DtImprimir.TableName = "DtDatosReporte";//FJRF - Renombramos la tabla
                    }
                    #endregion

                    #region FJRF - ImprimimosElReporte
                    CargarParametrosImpresion();//FJRF - Cargamos los parametros para la impresion, esto contiene titulo y parametros enviados al cystalreport

                    DsImprimir = new DataSet("dsOrdenesProcesadas");//FJRF - DataSet que esta vinculado al CrystalReport

                    //FJRF - ADICIONAMOS LAS TABLAS QUE NECESITE EL DATASET ASOCIADO AL CRYSTAL
                    DsImprimir.Tables.Add(DtEncabezadoYParametros.Copy());//Encabezado Informe
                    DsImprimir.Tables.Add(DtImprimir.Copy());//Detalle del Informe

                    produccion.reportes.Vista vista = new produccion.reportes.Vista { ds = DsImprimir, reporte = StrRutaReporteAImprimir };//FJRF - Enviamos los datos para que se imprima el reporte
                    vista.Show();//FJRF - Ejecutamos el reporte para que se muestre visualmente
                    #endregion
                }
                else//FJRF - Si el reporte no existe hacemos lo siguiente
                {
                    Msgbox("PROCESO CANCELADO", "El reporte no existe en la ruta: [" + StrRutaReporteAImprimir + "] por favor comuniquese con el administrador del sistema para que corriga este inconveniente.", MessageBoxButton.OK, MessageBoxImage.Error);//FJRF - Enviamos un mensaje al usuario
                }
            }
            catch (Exception ex)//FJRF - Si se presenta algun error hacemos lo siguiente
            {
                Msgbox("PROCESO CANCELADO - [Error del sistema]", ex.Message.ToString(), MessageBoxButton.OK, MessageBoxImage.Error);//FJRF - Enviamos un mensaje al usuario
            }
        }
        private void CargarParametrosImpresion()
        {
            #region FJRF - CreamosLasColmnasDelEncabezado
            DtEncabezadoYParametros = new DataTable("DtEncabezadoYParametros");//FJRF - Creamos la tabla que contendra el encabezado del informe

            //FJRF - CREAMOS LAS COLUMNAS DE LOS PARAMETROS A ENVIAR
            DtEncabezadoYParametros.Columns.Add("StrNombreEmpresa", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            DtEncabezadoYParametros.Columns.Add("StrTituloReporte", System.Type.GetType("System.String"));//FJRF - El titulo que tendra el reporte

            DtEncabezadoYParametros.Columns.Add("StrSeccion", System.Type.GetType("System.String"));//FJRF - Incluimos otros paramatros propios del reporte
            DtEncabezadoYParametros.Columns.Add("StrIncluye", System.Type.GetType("System.String"));//FJRF - Incluimos otros paramatros propios del reporte

            DtEncabezadoYParametros.Columns.Add("DttFechaInicial", System.Type.GetType("System.DateTime"));//FJRF - Incluimos otros paramatros propios del reporte
            DtEncabezadoYParametros.Columns.Add("DttFechaFinal", System.Type.GetType("System.DateTime"));//FJRF - Incluimos otros paramatros propios del reporte
            #endregion

            #region FJRF - AsignamosEnLasColmnasDelEncabezadoLosValores

            DataRow drEncabezadoYParametros;//FJRF - Creamos un manejador de filas para el DataTable actual

            drEncabezadoYParametros = DtEncabezadoYParametros.NewRow();//FJRF - Agregamos una nueva fila
            //FJRF - ASIGNAMOS LOS VALORES
            drEncabezadoYParametros["StrNombreEmpresa"] = MDOgeneral.strEmpresaImprime;//FJRF - Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drEncabezadoYParametros["StrTituloReporte"] = "ORDENES PROCESADAS POR DIAS";//FJRF - Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario

            string strTipo = "";
            switch (infOrdSec.Instance.codsec)
            {
                case "P":
                    strTipo = "Programadas";
                    break;
                case "C":
                    strTipo = "Cortadas";
                    break;
                case "R":
                    strTipo = "Preparadas";
                    break;
                case "G":
                    strTipo = "Guarnecidas";
                    break;
                case "M":
                    strTipo = "Montadas";
                    break;
                case "D":
                    strTipo = "Despachadas";
                    break;
            }
            drEncabezadoYParametros["StrSeccion"] = strTipo;//FJRF - Cargamos otros parametros que requiero el encabezado
            drEncabezadoYParametros["StrIncluye"] = infOrdSec.Instance.strTipo;//FJRF - Cargamos otros parametros que requiero el encabezado

            drEncabezadoYParametros["DttFechaInicial"] = DtpFechaInicial.SelectedDate;//FJRF - Cargamos otros parametros que requiero el encabezado
            drEncabezadoYParametros["DttFechaFinal"] = DtpFechaFinal.SelectedDate;//FJRF - Cargamos otros parametros que requiero el encabezado

            DtEncabezadoYParametros.Rows.Add(drEncabezadoYParametros);//FJRF - Agregamos a la tabla el registro creado
            DtEncabezadoYParametros.TableName = "DtEncabezadoYParametros";//FJRF - Le damos un nombre a la tabla creada para poder verla en el DataSet
            #endregion
        }

        #region FJRF - CajaDeTextoMsgbox
        protected void Msgbox(String StrCaption, String StrMensaje, MessageBoxButton MsbTipoBoton, MessageBoxImage MsbTipoImagenIcono)
        {
            MessageBoxButton buttons;
            buttons = MsbTipoBoton;

            MessageBoxImage icon = MsbTipoImagenIcono;
            MessageBox.Show(StrMensaje, StrCaption, buttons, icon);
        }
        #endregion
    }

    public class infOrdSec:ObservableObject 
    {

      #region singleton
        
        private static infOrdSec instance = null;

        //---------------------------------------------------
        private VMvisorFotoReferencia _visorFotoReferencia = new VMvisorFotoReferencia();
        public VMvisorFotoReferencia visorFotoReferencia
        {
            get { return _visorFotoReferencia; }
            set { _visorFotoReferencia = value; RaisePropertyChangedEvent("visorFotoReferencia"); }
        }

        public void llenarImagen()
        {
            if (OrdProSec.Rows.Count>0)
            {
                if (OrdProSecsel == -1)
                {
                    visorFotoReferencia.strCodigo = OrdProSec.Rows[0]["CODREF_TMP"].ToString().Substring(0, 4);
                    visorFotoReferencia.strColor = OrdProSec.Rows[0]["CODCOL_TMP"].ToString().Substring(0, 2);
                }
                else
                {
                    visorFotoReferencia.strCodigo = OrdProSec.Rows[OrdProSecsel]["CODREF_TMP"].ToString().Substring(0, 4);
                    visorFotoReferencia.strColor = OrdProSec.Rows[OrdProSecsel]["CODCOL_TMP"].ToString().Substring(0, 2);
                }
                
            }
        }

        protected infOrdSec()
        {
            MDOgeneral.conectar();
            strTituloVentana = "Resumen de ordenes por sección - Usuario: " + MDOgeneral.usuario + " - [FRMinfOrdSec]";
        }
        
        public static infOrdSec Instance
        {
            get
            {
                if (instance == null)
                    instance = new infOrdSec();
                return instance;
            }
            set
            {
                if (instance != null)
                    instance = null;
            }
        }

        #endregion
        
        private string _strTipo;
        public string strTipo
        {
            get { return _strTipo; }
            set { _strTipo = value; RaisePropertyChangedEvent("strTipo"); }
        }


        private string _strTituloVentana;
        public string strTituloVentana
        {
            get { return _strTituloVentana; }
            set { _strTituloVentana = value; RaisePropertyChangedEvent("strTituloVentana"); }
        }
        
        private DateTime _desde = DateTime.Today;
        public DateTime desde 
        {
            get { return _desde; }
            set { _desde = value; RaisePropertyChangedEvent("desde"); }
        }

        private DateTime _hasta = DateTime.Today;
        public DateTime hasta 
        {
            get { return _hasta; }
            set { _hasta = value; RaisePropertyChangedEvent("hasta"); }
        }

       
        private string _codsec="P";
        public string codsec 
        {
            get { return _codsec; }
            set 
            { 
                _codsec = value; 
                RaisePropertyChangedEvent("codsec");
                OrdProSec.Clear();

                if (String.IsNullOrEmpty(strTipo) == true)
                {
                    strTipo = "";
                }
                consInfOrdSec(strTipo);
            }
        }

        private DataTable _OrdProSec = new DataTable();
        public DataTable OrdProSec 
        {
            get { return _OrdProSec; }
            set { _OrdProSec = value; RaisePropertyChangedEvent("OrdProSec"); }        
        }

        private DataTable _DtOrdenesProcesadas = new DataTable();
        public DataTable DtOrdenesProcesadas
        {
            get { return _DtOrdenesProcesadas; }
            set { _DtOrdenesProcesadas = value; RaisePropertyChangedEvent("DtOrdenesProcesadas"); }
        }

        int _OrdProSecsel;
        public int OrdProSecsel
        {
            get { return _OrdProSecsel; }
            set 
            { 
                _OrdProSecsel = value; 
                RaisePropertyChangedEvent("OrdProSecsel");
                llenarImagen();
            }
        }

        Double _DblCantidadSumada;
        public Double DblCantidadSumada
        {
            get { return _DblCantidadSumada; }
            set
            {
                _DblCantidadSumada = value;
                RaisePropertyChangedEvent("DblCantidadSumada");
            }
        }

        Double _DblCantidadProcesada;
        public Double DblCantidadProcesada
        {
            get { return _DblCantidadProcesada; }
            set
            {
                _DblCantidadProcesada = value;
                RaisePropertyChangedEvent("DblCantidadProcesada");
            }
        }

        Double _DblDiferencia;
        public Double DblDiferencia
        {
            get { return _DblDiferencia; }
            set
            {
                _DblDiferencia = value;
                RaisePropertyChangedEvent("DblDiferencia");
            }
        }

        public void consInfOrdSec(string strProcesosIncluidosParaSp) 
        {
            try 
            {
                Mouse.OverrideCursor = Cursors.Wait;
                clases.CLSENCORDP encOrd = new clases.CLSENCORDP();
                encOrd.RepOrdProSec(codsec, desde, hasta, strProcesosIncluidosParaSp);
                OrdProSec= encOrd.OrdProSec;
                DtOrdenesProcesadas = encOrd.DtOrdenesProcesadas;

                #region FJRF - SumamosLasCantidades
                Double DblCantidad = 0;//FJRF - Inicializamos las variables en cero
                Double DblProcesado = 0;//FJRF - Inicializamos las variables en cero
                Double DblDirerencias = 0;//FJRF - Inicializamos las variables en cero

                if (OrdProSec.Rows.Count > 0)//FJRF - Si hay datos entonces hacemos lo siguiente
                {
                    for (int IntFilaActual = 0; IntFilaActual < OrdProSec.Rows.Count; IntFilaActual++)//FJRF - Recorremos la informacion encontrada
                    {
                        String StrCantidad = OrdProSec.Rows[IntFilaActual][11].ToString();//FJRF - Extraemos el valor y lo asignamos a una variable
                        String StrProcesado = OrdProSec.Rows[IntFilaActual][9].ToString();//FJRF - Extraemos el valor y lo asignamos a una variable
                        
                        if (String.IsNullOrEmpty(StrCantidad) == true)//FJRF - Validamos que el dato no venga vacio o nulo y si es asi hacemos lo siguiente
                        {
                            StrCantidad = "0";//FJRF - Inicializamos las variables en cero
                        }
                        if (String.IsNullOrEmpty(StrProcesado) == true)//FJRF - Validamos que el dato no venga vacio o nulo y si es asi hacemos lo siguiente
                        {
                            StrProcesado = "0";//FJRF - Inicializamos las variables en cero
                        }
                        DblCantidad = DblCantidad + Double.Parse(StrCantidad);//FJRF - Vamos sumando los valores encontrados
                        DblProcesado = DblProcesado + Double.Parse(StrProcesado);//FJRF - Vamos sumando los valores encontrados
                    }
                }

                DblCantidadSumada = DblCantidad;//FJRF - Asignamos las sumas
                DblCantidadProcesada = DblProcesado;//FJRF - Asignamos las sumas

                DblDirerencias = DblCantidadSumada - DblCantidadProcesada;//FJRF - Restamos la diferencia
                DblDiferencia = DblDirerencias;//FJRF - Asignamos el valor encontrado
                #endregion

                Mouse.OverrideCursor = Cursors.Arrow;
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }
        public void Imprimir() 
        {
            try 
            {
                DataSet ds = new DataSet("dsOrdSec");
                OrdProSec.TableName = "TMPORDTER";
                ds.Tables.Add(OrdProSec.Copy());
                DataTable t = new DataTable("ENCABEZADO");
                t.Columns.Add("TIPO");
                t.Columns.Add("DESDE");
                t.Columns.Add("HASTA");
                DataRow r = t.NewRow();

                string tipo="";
                switch(codsec)
                {
                    case "P":
                        tipo="Programadas";
                        break;
                    case "C":
                        tipo="Cortadas";
                        break;
                    case "R":
                        tipo="Preparadas";
                        break;
                    case "G":
                        tipo="Guarnecidas";
                        break;
                    case "M":
                        tipo="Montadas";
                        break;
                    case "D":
                        tipo="Despachadas";
                        break;
                }
                r["TIPO"] = tipo;
                r["DESDE"] = desde;
                r["HASTA"] = hasta;
                t.Rows.Add(r);
                ds.Tables.Add(t.Copy());
                Vista vista = new Vista { ds = ds, reporte = @"reportes\repResOrdSec.rpt" };
                vista.Show();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }
    }

}
